#pragma once
#ifndef OBR_PATHINTEGRATOR_H
#define OBR_PATHINTEGRATOR_H

#include "core/Integrator.h"

namespace OBR
{
class PathIntegrator : public Integrator, public Configurable<PathIntegrator>
{
private:
    PathIntegratorData settings;

public:
    PathIntegrator(/* args */);
    ~PathIntegrator();

protected:
    /* ------------------------ override Configurable ----------------------- */

    /**
     * @brief create object from config
     *
     * @param config
     */
    void _buildFromConfig(const Json::Value &config) override;

private:
    /* ------------------------ override ProgramEntry ----------------------- */

    /**
     * @brief Get the Program Group Options of this type
     *
     * @return OptixProgramGroupOptions&
     */
    OptixProgramGroupOptions &getProgramGroupOptions() override;

    /**
     * @brief Get the Program Group Desc of this type
     *
     * @return OptixProgramGroupOptions&
     */
    OptixProgramGroupDesc &getProgramGroupDesc() override;

    /**
     * @brief upload sbt data to cuda buffer (not all programs use this entry)
     *
     */
    void uploadSbtData() override;
};

} // namespace OBR

#endif
